import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  UseInterceptors,
  Res,
  UploadedFile,
} from '@nestjs/common';
import { UploadService } from './upload.service';
import { CreateUploadDto } from './dto/create-upload.dto';
import { UpdateUploadDto } from './dto/update-upload.dto';
import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express';
import { Response } from 'express';
import { join } from 'path';
import { zip } from 'compressing';

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}

  @Post('album')
  // 上传文件需要使用拦截器（配置文件参数名），他会帮我们处理前端传过来的文件
  // 里面导入文件拦截器，配置：前端请求文件参数名
  @UseInterceptors(FileInterceptor('file'))
  // 文件对象不能用req获取到，需要用@UploadedFile装饰器拿到文件对象
  upload(@UploadedFile() file) {
    console.log('用户上传文件', file);
    return {
      code: 200,
      message: '上传成功',
    };
  }

  //
  @Get('export')
  downLoad(@Res() res: Response) {
    const url = join(__dirname, '../images/1712340226985.png');
    // res.download方法，直接把文件响应出去
    res.download(url);
  }

  // 响应为流式(二进制格式)
  @Get('stream')
  async downLoadStream(@Res() res: Response) {
    // 文件地址
    const url = join(__dirname, '../images/1712340885200.png');
    // 使用zip库把文件转换为流式，实例zip.stream方法
    const tarStream = new zip.Stream();
    // 导入文件
    await tarStream.addEntry(url);
    // 响应头设置为流式数据(固定写法)
    res.setHeader('Content-Type', 'application/octet-stream');
    res.setHeader('Content-Dispostion', 'attachment; filename=streamFile');
    // 把响应对象响应出去
    tarStream.pipe(res);
  }

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateUploadDto: UpdateUploadDto) {
    return this.uploadService.update(+id, updateUploadDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.uploadService.remove(+id);
  }
}
